﻿using System;
using System.Linq;
using System.Text;
using Spring.Data.Core;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using Spring.Data;
using Spring.Data.Common;
using GestionadorBaseDatos;
using CRUD.InterfaceDAO;
namespace CRUD.DAO
{
    /// <summary>
    /// Clase encargada de interactuar con la tabla USUARIO del modelo
    /// </summary>
    public class UsuarioDao : AdoDaoSupport, IDaoUsuario
    {

        #region Querys para metodos

        private string sqlUpdate = @"update usuario set correoElectronico = @correoElectronico, estado = @estado, codigoPostal = @codigoPostal, pais = @pais, direccion= @direccion, ciudad = @ciudad, telefono = @telefono where nickname = @nickname";
        private string sqlUsuarioByNickname = "select nombre,apellido,correoElectronico,telefono,estado,fechaNacimiento,pais,direccion,ciudad,codigoPostal,nickname,password,preguntaSeguridad,respuesta,divisa from usuario where nickname = @nickname";
        private string sql = "select nombre,apellido,correoElectronico,telefono,estado,fechaNacimiento,pais,direccion,ciudad,codigoPostal,nickname,password,preguntaSeguridad,respuesta,divisa from usuario";
        private string sqlInsert = "INSERT INTO usuario (nombre,apellido,correoElectronico,telefono,estado,fechaNacimiento,pais,direccion,ciudad,codigoPostal,nickname,password,preguntaSeguridad,respuesta,divisa) VALUES (@nombre,@apellido,@correoElectronico,@telefono,@estado,@fechaNacimiento,@pais,@direccion,@ciudad,@codigoPostal,@nickname,@password,@preguntaSeguridad,@respuesta,@divisa)";
        private string sqlPaU = @"select nombre,apellido,correoElectronico,telefono,estado,fechaNacimiento,pais,direccion,ciudad,codigoPostal,nickname,password,preguntaSeguridad,respuesta,divisa from usuario where nickname = @nickname and password = @password";
        # endregion

        # region metodos
        public void Update(Usuario u)
        {

            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();


            dbParameters.Add("@nickname", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Nickname;
            dbParameters.Add("@correoElectronico", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.CorreoElectronico;
            dbParameters.Add("@codigoPostal", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = u.CodigoPostal;
            dbParameters.Add("@telefono", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Telefono;
            dbParameters.Add("@estado", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Estado;
             dbParameters.Add("@pais", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Pais;
            dbParameters.Add("@direccion", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Direccion;
            dbParameters.Add("@ciudad", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Ciudad;



            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlUpdate, dbParameters);


             
        }


        public virtual IList GetAll()
        {
            System.Collections.IList lista = AdoTemplate.QueryWithRowMapperDelegate(CommandType.Text, sql,
                        delegate(IDataReader iDataReader, int rowNum)
                        {
                            Usuario usuario = new Usuario();
                            usuario.Nombre = iDataReader.GetString(0);
                            usuario.Apellido = iDataReader.GetString(1);
                            usuario.CorreoElectronico = iDataReader.GetString(2);
                            usuario.Telefono = iDataReader.GetString(3);
                            usuario.Estado = iDataReader.GetString(4);
                            usuario.FechaNacimiento = iDataReader.GetDateTime(5);
                            usuario.Pais = iDataReader.GetString(6);
                            usuario.Direccion = iDataReader.GetString(7);
                            usuario.Ciudad = iDataReader.GetString(8);
                            usuario.CodigoPostal = iDataReader.GetInt32(9);
                            usuario.Nickname = iDataReader.GetString(10);
                            usuario.Password = iDataReader.GetString(11);
                            usuario.PreguntaSeguridad = iDataReader.GetString(12);
                            usuario.Respuesta = iDataReader.GetString(13);
                            usuario.Divisa = iDataReader.GetString(14);

                            return usuario;
                        });

            return lista;
        }

        public void Insert(Usuario crear)
        {

            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@nombre", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Nombre;
            dbParameters.Add("@apellido", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Apellido;
            dbParameters.Add("@correoElectronico", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.CorreoElectronico;
            dbParameters.Add("@telefono", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Telefono;
            dbParameters.Add("@estado", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Estado;
            dbParameters.Add("@fechaNacimiento", MySql.Data.MySqlClient.MySqlDbType.DateTime, 50).Value = crear.FechaNacimiento;
            dbParameters.Add("@pais", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Pais;
            dbParameters.Add("@direccion", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Direccion;
            dbParameters.Add("@ciudad", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Ciudad;
            dbParameters.Add("@codigoPostal", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.CodigoPostal;
            dbParameters.Add("@nickname", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Nickname;
            dbParameters.Add("@password", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Password;
            dbParameters.Add("@preguntaSeguridad", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.PreguntaSeguridad;
            dbParameters.Add("@respuesta", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Respuesta;
            dbParameters.Add("@divisa", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Divisa;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlInsert, dbParameters);


        }
        public IList GetByPasswordAndUser(string nickname, string password)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@nickname", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = nickname;
            dbParameters.Add("@password", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = password;

            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlPaU, new UsuarioRowMapper(), dbParameters);
        }


        public Usuario GetByNickname(string Nickname)
        {
            return (Usuario)AdoTemplate.QueryForObject(CommandType.Text, sqlUsuarioByNickname, new UsuarioRowMapper(), "@nickname", DbType.String, 30, Nickname);
        }

        # endregion
    }
}
